<?php

/**
 * Solicitud form.
 *
 * @package    BecArTe
 * @subpackage form
 * @author     Your name here
 * @version    SVN: $Id: sfDoctrineFormTemplate.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class SolicitudForm extends BaseSolicitudForm
{
  public function configure()
  {
    $sol = $this->getObject();
    if($sol->isNew()) {
      $sol->setFecha(date('Y-m-d'));
      $this->useFields(array('alumno_id','beca_id','observacion'));
      $this->widgetSchema['alumno_id'] = new sfWidgetFormInputHidden();
      $this->widgetSchema['beca_id']->setOption('table_method', 'getBecasEnInscripcion');
      $this->widgetSchema->setHelp('beca_id','Seleccione la beca que desea solicitar para el alumno.');      
      $this->mergePostValidator(
              new sfValidatorCallback(array('callback' => array($this, 'controlarUnicidad')))
             );
      $this->mergePostValidator(
              new sfValidatorCallback(array('callback' => array($this, 'controlarSuperposicionConBecasOtorgadas')))
             );
    } else {
      $this->useFields(
         sfContext::getInstance()->getUser()->hasCredential('aspirante')
         ? array()
         : array('observacion')
      );
      $limitar_aspirante = sfContext::getInstance()->getUser()->hasCredential('aspirante');
      $reqPendientes = $sol->getRequisitosPendientes($limitar_aspirante);
      if($reqPendientes->count()) {
        $this->embedForm(
          'requisitos_faltantes',
          new AcreditacionMultiplesRequisitosForm(null, array(
            'aid' => $sol->getAlumnoId(),
            'requisitos' => $reqPendientes
            )
          )
        );      
      }
/*    esto anda, pero usaBA el formulario de Acreditacion sin mirar la jerarquia...
      por ahora lo corregí parcheando a mano al framework
      modif archivo: sfFormDoctrine.class.php +linea 135:
          if($formClass === null) $r = new ReflectionClass(get_class($childObject).'Form'); //patch by Locutus
      sino, hariamos lo mismo q para los pendientes, a mano    
*/     
      if(count($sol->getAcreditaciones())) {
        $this->embedRelation('acreditaciones as requisitos_ya_presentados'); 
      }

    }
  }

  
  /* Un alumno no puede tener más de una solicitud para una beca particular */
  public function controlarUnicidad($validator, $values)
  {
    if(Doctrine_Core::getTable('Solicitud')->haySolicitud($values['alumno_id'], $values['beca_id']))
    {
      throw new sfValidatorErrorSchema(
              $validator,
              array('beca_id' => new sfValidatorError(
                      $validator, 'Ya existe una solicitud de este tipo para el alumno.'
                      )
                   )
            );
    }
    return $values;
  }


  /* Un alumno no puede tener más de una beca otorgada. No puede solicitar una beca
   * si su periodo de vigencia se superpone con una ya otorgada */
  public function controlarSuperposicionConBecasOtorgadas($validator, $values)
  {
    $sol = $this->getObject();
    $alu = $sol->getAlumno();
    foreach($alu->getBecasOtorgadas() as $becaOtorgada) {
      if($becaOtorgada->getEstado() != 'Finalizada') {
        if($sol->seSuperponeCon($becaOtorgada->getSolicitud())) {
            throw new sfValidatorErrorSchema(
                    $validator,
                    array('beca_id' => new sfValidatorError(
                            $validator, 
                            'La beca indicada se superpone con una ya otorgada: '.
                            $becaOtorgada->getSolicitud().'.'
                            )
                         )
                  );
        }
      }
    }
    return $values;
  }



  public function saveEmbeddedForms($con = null, $forms = null)
  {
    if (null === $forms && isset($this['requisitos_faltantes']) )
    {
      $this->embeddedForms['requisitos_faltantes']->quitarVacios();
    }
    return parent::saveEmbeddedForms($con, $forms);
  }
  

  /* si marca para eliminar alguna acreditacion ya presentada se la quita */
  public function doSave($con = null)
  {
    $ids = array();
    if (isset($this->widgetSchema['requisitos_ya_presentados'])) { 
      foreach($this->getValue('requisitos_ya_presentados') as $idx => $presentado) {
        if($presentado['borrar']) { //quita la relación del que borra
          //unset($this->values['requisitos_ya_presentados'][$idx]);          
          $this->getObject()->unlink('acreditaciones', $presentado['id']);
          $ids[]=$presentado['id'];
        }
      }
    }
    
    parent::doSave($con);
    
    if(count($ids)) {
      $borrados = Doctrine_Core::getTable('Acreditacion')->createQuery()
              ->whereIn('id',$ids)
              ->execute();
      $esAspirante = sfContext::getInstance()->getUser()->hasCredential('aspirante');
      foreach($borrados as $acred) {
        if(!$esAspirante || !count($acred->getSolicitudes()) ) {
          //un aspirante puede sólo querer quitarla de esta solicitud pero
          //mantenerla en otras -si las hay-
          //Una quitada por un atPublico por ejemplo es inválida y se elimina
          //de verdad
          $acred->delete(); 
        }
      }
    }

    //vuelvo a pedir que se grabe la solicitud
    //después de haberse grabado se pudo completar de requisitos y cambiaria de estado,
    //o eliminarse uno y volveria a En Presentacion...
    $this->getObject()->save();
  }
}
